https://leetcode.cn/problems/sudoku-solver/
class Solution {
public:
    bool checkcol[9][10],checkrow[9][10];
    bool checkgrid[3][3][10];

    bool dfs(vector<vector<char>>& board)
    {
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                if(board[i][j]=='.')
                {                
                    //填数
                    for(int num=1;num<=9;num++)
                    {
                        if(!checkrow[i][num]&&!checkcol[j][num]&&!checkgrid[i/3][j/3][num])
                        {
                            board[i][j]=num+'0';
                            checkrow[i][num]=checkcol[j][num]=checkgrid[i/3][j/3][num]=true;
                            if(dfs(board))
                                return true;
                            //失败了才需要回溯
                            board[i][j]='.';
                            checkrow[i][num]=checkcol[j][num]=checkgrid[i/3][j/3][num]=false;
                        }
                       
                    }
                     return false;
                }

            }
        }
        return true;
    }
    void solveSudoku(vector<vector<char>>& board) {
        //初始化
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                if(board[i][j]!='.')
                {
                    int num=board[i][j]-'0';
                    checkrow[i][num]=checkcol[j][num]=checkgrid[i/3][j/3][num]=true;
                }
            }
        }
        dfs(board);
    }
};